package arithmetic2;

/**
 * @author Ajie
 * @date 2019-09-29
 * @function
 *
 * java提供两种右移运算符，属于位运算符。位运算符用来对二进制位进行操作。
 * >>  ：算术右移运算符，也称带符号右移。用最高位填充移位后左侧的空位。
 * >>>：逻辑右移运算符，也称无符号右移。只对位进行操作，用0填充左侧的空位。
 *
 * todo 关键在于位运算
 * 算数为 + - 优先于 >>
 *
 * 结论：
 * 2数相加
 * res > Integer.MAX_VALUE 无符号 右移
 *      因为越界后最高位为1 整数变成负数
 * res < 0 有符号右移
 * res <
 * todo ....负数越界，相加，待算
 */
public class T_addTwoNum {
    public static void main(String[] args) {

        System.out.println("最大值: "+Integer.MAX_VALUE);
        System.out.println("最大值: "+(Math.pow(2,31)-1));

        int i = Integer.MAX_VALUE - 1;
        int j = Integer.MAX_VALUE - 3;
        System.out.println("正数越界---------------------》");
        System.out.println("max >>>1: "+((i + j)>>>1));
        System.out.println("max >>1: "+((i + j)>>1));
        System.out.println("(i-j)/2+j: "+((i-j)/2+j));

        System.out.println();
        System.out.println("负数正常运算------------------》");
        System.out.println("-4 >> 1: "+((-4)>>1));
        System.out.println("4-4 >> 1: "+(4-4>>1));
        System.out.println("-4 >>> 1: "+((-4)>>>1));
        System.out.println("-100 -102 >>1: "+((-100+(-102))>>1));
        System.out.println("-100 -102 >>>1: "+((-100+(-102))>>>1));

        System.out.println();
        System.out.println("负数越界------------------》");
        System.out.println("min: "+Integer.MIN_VALUE);
        int m = Integer.MIN_VALUE + 1;
        int n = Integer.MIN_VALUE + 3;
        System.out.println("min(m+n) >>>1: "+((m+n)>>>1));
        System.out.println("min(m+n) >>1: "+((m+n)>>1));
        System.out.println(((m>>1)+(n>>1)));
        System.out.println("(i-j)/2+j: "+((m-n)/2+n));

        System.out.println("min >>>1: "+(Integer.MIN_VALUE>>>1));
        System.out.println("min >>1: "+(Integer.MIN_VALUE>>1));

    }
}
